package com.bestcem.xm.qdes.handler.export.type;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bestcem.xm.qdes.enums.QuestionTypeEnum;
import com.bestcem.xm.qdes.handler.export.BaseTypeHandler;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

@Component
public class AutoTableHandler implements BaseTypeHandler {

    @Override
    public List<Object> getItems(JSONObject questionDict, JSONObject qgidDict, List<JSONObject> relatedRefs) {
        // 自增表格题
        List<Object> items = new ArrayList<>();

        String qcid = questionDict.getString("cid");
        String qtitle = questionDict.getString("title");
        String qtype = questionDict.getString("qtype");

        int dispSelect = (int) questionDict.getOrDefault("dispSelect", 0);  // dispSelect:0 选项设置; 1 代码设置
        boolean codeSelect = (boolean) questionDict.getOrDefault("codeSelect", true); // true: 显示代码/false: 抹灰代码

        int jumpSelect = (int) questionDict.getOrDefault("jumpSelect", 0);  // jumpSelect:0 选项设置; 1 代码设
        String dispCode = (String) questionDict.getOrDefault("disp_code", "");  // 显示代码
        String jumpCode = (String) questionDict.getOrDefault("jump_code", "");  // 跳转代码
        String autoCode = (String) questionDict.getOrDefault("auto_code", "");  // 自动勾选代码

        String defaultRows = (String) questionDict.getOrDefault("defaultRows", "");  // 默认行数
        String maxRows = (String) questionDict.getOrDefault("maxRows", "");  // 最大行数

        boolean required = questionDict.getBoolean("required");  // 必答

        String typeStr = QuestionTypeEnum.valueOf("QUESTION_TYPE_" + qtype.toUpperCase()).getDesc();

        List<String> item0 = new ArrayList<>();
        item0.add(qcid + "[" + typeStr + "]");
        item0.add(qtitle);

        List<String> qAttr = new ArrayList<>();
        qAttr.add(required ? "必答" : "非必答");

        qAttr.add(String.format("默认行数#%s", defaultRows));
        qAttr.add(String.format("最大行数#%s", maxRows));

        if (dispSelect == 1 && codeSelect) {
            qAttr.add("显示代码");
        } else if (dispSelect == 1 && !codeSelect) {
            qAttr.add("抹灰代码");
        } else {
            qAttr.add("");
        }
        // 题目属性
        List<String> allAttr = new ArrayList<>();
        qAttr.forEach(at -> {
            allAttr.add("[" + at + "]");
        });
        item0.add(String.join("", allAttr));
        // 显示代码，跳转代码，自动勾选代码
        item0.add(dispSelect == 1 ? dispCode : "");
        item0.add(jumpSelect == 1 ? jumpCode : "");
        item0.add(autoCode);
        items.add(item0);

        JSONArray optionItems = Optional.ofNullable(questionDict.getJSONArray("items")).orElse(new JSONArray());
        items.add(Collections.singletonList("选项"));
        for (int ind = 0; ind < optionItems.size(); ind++) {
            JSONObject optionDict = optionItems.getJSONObject(ind);
            String setType = optionDict.getString("setType"); // 题目类型
            Object setValue = optionDict.get("setValue"); //值
            Boolean required1 = optionDict.getBoolean("required"); //必填
            String uniqueStr = optionDict.getString("unique"); //唯一性
            Boolean unique = !StringUtils.isEmpty(uniqueStr) && (!"none".equals(uniqueStr) && Boolean.parseBoolean(uniqueStr));

            List<String> optionAttr = new ArrayList<>();
            if ("unlimit".equals(setType)) {
                // 不限
                optionAttr.add("不限");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(0))) {
                    optionAttr.add(String.format("最少#%s", castList(setValue, String.class).get(0)));
                }
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(1))) {
                    optionAttr.add(String.format("最多#%s", castList(setValue, String.class).get(1)));
                }
            } else if ("int".equals(setType)) {
                // 整数
                optionAttr.add("整数");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(0))) {
                    optionAttr.add(String.format("最少#%s", castList(setValue, String.class).get(0)));
                }
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(1))) {
                    optionAttr.add(String.format("最多#%s", castList(setValue, String.class).get(1)));
                }
            } else if ("decimal".equals(setType)) {
                // 小数
                optionAttr.add("小数");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(0))) {
                    optionAttr.add(String.format("最少#%s", castList(setValue, String.class).get(0)));
                }
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(1))) {
                    optionAttr.add(String.format("最多#%s", castList(setValue, String.class).get(1)));
                }
            } else if ("en".equals(setType)) {
                // 字母
                optionAttr.add("字母");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(0))) {
                    optionAttr.add(String.format("最少#%s", castList(setValue, String.class).get(0)));
                }
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(1))) {
                    optionAttr.add(String.format("最多#%s", castList(setValue, String.class).get(1)));
                }
            } else if ("zh".equals(setType)) {
                // 中文
                optionAttr.add("中文");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(0))) {
                    optionAttr.add(String.format("最少#%s", castList(setValue, String.class).get(0)));
                }
                if (setValue instanceof List && StringUtils.isNotEmpty(castList(setValue, String.class).get(1))) {
                    optionAttr.add(String.format("最多#%s", castList(setValue, String.class).get(1)));
                }
            } else if ("email".equals(setType)) {
                // email
                optionAttr.add("邮件");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (unique != null && unique) {
                    optionAttr.add("唯一");
                }
            } else if ("date".equals(setType)) {
                // 日期
                optionAttr.add("日期");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue instanceof String && "yyyy-MM-dd".equals(setValue.toString())) {
                    optionAttr.add("年月日");
                } else if (setValue instanceof String && "yyyy-MM".equals(setValue.toString())) {
                    optionAttr.add("年月");
                } else if (setValue instanceof String && "yyyy".equals(setValue.toString())) {
                    optionAttr.add("年");
                }
            } else if ("mobile".equals(setType)) {
                // mobile
                optionAttr.add("手机号码");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (unique != null && unique) {
                    optionAttr.add("唯一");
                }
            } else if ("tel".equals(setType)) {
                // 固话
                optionAttr.add("固话");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (unique != null && unique) {
                    optionAttr.add("唯一");
                }
            } else if ("mobile_tel".equals(setType)) {
                // 手机/固话
                optionAttr.add("手机/固话");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (unique != null && unique) {
                    optionAttr.add("唯一");
                }
            } else if ("select".equals(setType)) {
                // 下拉单项
                optionAttr.add("下拉单项");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (setValue != null) {
                    String seVal = setValue.toString().endsWith(";") ? setValue.toString()
                            .substring(0, setValue.toString().length() - 1) : setValue.toString();
                    String ops = String.join(",", Arrays.stream(seVal.split(";")).map(String::trim)
                            .collect(Collectors.toList()));
                    optionAttr.add(String.format("选项#%s", ops));
                }
            } else if ("idCard".equals(setType)) {
                // idCard
                optionAttr.add("身份证号");
                optionAttr.add(required1 ? "必答" : "非必答");
                if (unique != null && unique) {
                    optionAttr.add("唯一");
                }
            }

            String optionAttrStr = String.join(",", optionAttr);
            items.add(Arrays.asList(optionDict.getString("oid"), optionDict.getString("title"), optionAttrStr, "", "", ""));
        }

        return items;
    }

    @Override
    public String getType() {
        return "auto_table";
    }
}
